<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>第九章：实际应用案例 - 9.2 实现自动化文本生成</title>
    <link rel="stylesheet" href="../shared_styles.css">
</head>
<body>
    <div class="container">
        <h1> 第九章：实际应用案例</h1>
        <section id="s9-2">
            <h2>9.2 实现自动化文本生成（如博客文章、邮件）</h2>
            <p>大型语言模型（LLM）如Qwen在文本生成方面表现出色。结合Langchain，我们可以构建强大的自动化文本生成应用，例如自动撰写博客文章、生成邮件草稿、创作故事等。</p>
            <p>在本节中，我们将演示如何使用Langchain和Qwen模型来：</p>
            <ol>
                <li>根据主题和关键词生成博客文章大纲。</li>
                <li>根据大纲和指定风格扩写博客文章的某个段落。</li>
                <li>根据输入信息生成一封简单的邮件草稿。</li>
            </ol>
            <p>我们将主要利用前面章节学到的<code>PromptTemplate</code>和LLM Chain（通过LCEL的<code>prompt | llm</code>形式）来实现这些功能。</p>

            <h3>准备工作：初始化Qwen LLM</h3>
            <p>首先，确保你的环境已配置好，并且可以初始化Qwen模型。</p>
            <pre><code class="language-python">
from langchain_openai import ChatOpenAI # Qwen兼容
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate
from langchain_core.output_parsers import StrOutputParser
from dotenv import load_dotenv
import os

# 加载环境变量
load_dotenv()
api_key = os.environ.get("DASHSCOPE_API_KEY")
if not api_key:
    raise ValueError("DASHSCOPE_API_KEY not found. Please set it in your .env file.")

# 初始化Qwen聊天模型
qwen_llm = ChatOpenAI(
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    api_key=api_key,
    model="qwen-plus", # 可以根据需求选择 "qwen-turbo", "qwen-max" 等
    temperature=0.7,   # 对于创意生成，可以适当提高温度
    streaming=False
)
print("Qwen LLM 初始化成功。")
            </code></pre>

            <h3>案例1：生成博客文章大纲</h3>
            <p>假设我们想写一篇关于“人工智能在教育领域的应用”的博客文章。我们可以让LLM帮助我们生成一个初步的大纲。</p>
            <pre><code class="language-python">
# 定义生成博客大纲的提示模板
blog_outline_prompt_template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        "你是一位专业的博客内容规划师。请根据用户提供的主题和关键词，生成一份结构清晰、内容丰富的博客文章大纲。"
    ),
    HumanMessagePromptTemplate.from_template(
        "主题：{topic}\n"
        "主要关键词：{keywords}\n"
        "请为这个主题生成一个包含引言、至少三个主要部分（每个部分包含2-3个子要点）和结论的博客大纲。"
    )
])

# 构建LCEL链
blog_outline_chain = blog_outline_prompt_template | qwen_llm | StrOutputParser()

# 输入参数
topic_input = "人工智能在教育领域的应用"
keywords_input = "个性化学习, 智能辅导系统, 教育公平, AI伦理"

print(f"\n--- 案例1：生成博客文章大纲 ---")
print(f"主题: {topic_input}")
print(f"关键词: {keywords_input}")

try:
    outline_result = blog_outline_chain.invoke({
        "topic": topic_input,
        "keywords": keywords_input
    })
    print("\n生成的博客大纲：")
    print(outline_result)
except Exception as e:
    print(f"生成大纲时出错: {e}")
            </code></pre>
            <p>LLM会根据提供的主题和关键词，生成一个结构化的大纲，为后续的内容创作打下基础。</p>

            <h3>案例2：根据大纲扩写段落</h3>
            <p>有了大纲后，我们可以选择大纲中的某一部分，让LLM帮助我们扩写成详细的段落。我们还可以指定生成的风格。</p>
            <pre><code class="language-python">
# 假设从上一步生成的大纲中，我们选择了某个要点进行扩写
# 例如，大纲中可能有："第二部分：AI在个性化学习中的具体体现 2.1 AI驱动的自适应学习平台"

# 定义扩写段落的提示模板
paragraph_expansion_prompt_template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        "你是一位才华横溢的博客写手。请根据用户提供的大纲要点、主题和期望风格，撰写一段流畅、有深度的段落。"
    ),
    HumanMessagePromptTemplate.from_template(
        "博客主题：{topic}\n"
        "当前要扩写的章节/要点：{section_point}\n"
        "期望风格：{style}\n"
        "请围绕此要点，撰写大约150-200字的详细内容。确保内容与主题相关，并符合指定风格。"
    )
])

# 构建LCEL链
paragraph_expansion_chain = paragraph_expansion_prompt_template | qwen_llm | StrOutputParser()

# 输入参数
# (假设outline_result是上一步得到的大纲字符串)
# 我们可以从中提取一个要点，或者手动指定
section_point_input = "AI驱动的自适应学习平台如何根据学生进度调整教学内容" # 示例要点
style_input = "专业且富有洞察力，语言通俗易懂"

print(f"\n--- 案例2：根据大纲扩写段落 ---")
print(f"主题: {topic_input}") # 使用之前的topic_input
print(f"扩写要点: {section_point_input}")
print(f"期望风格: {style_input}")

try:
    expanded_paragraph = paragraph_expansion_chain.invoke({
        "topic": topic_input,
        "section_point": section_point_input,
        "style": style_input
    })
    print("\n生成的段落内容：")
    print(expanded_paragraph)
except Exception as e:
    print(f"扩写段落时出错: {e}")
            </code></pre>
            <p>通过这种方式，我们可以逐步将整个大纲填充为完整的博客文章。</p>

            <h3>案例3：生成邮件草稿</h3>
            <p>LLM也可以帮助我们快速生成日常邮件。例如，生成一封会议邀请邮件。</p>
            <pre><code class="language-python">
# 定义生成邮件的提示模板
email_prompt_template = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        "你是一位专业的行政助理，擅长撰写简洁、正式的商务邮件。"
    ),
    HumanMessagePromptTemplate.from_template(
        "请帮我草拟一封邮件。\n"
        "收件人：{recipient_name}\n"
        "会议主题：{meeting_topic}\n"
        "会议日期：{meeting_date}\n"
        "会议时间：{meeting_time}\n"
        "会议地点/方式：{meeting_location}\n"
        "邮件目的：{email_purpose}\n"
        "发件人署名：{sender_name}\n"
        "请包含标准的邮件格式，如称呼、正文、结束语和署名。"
    )
])

# 构建LCEL链
email_generation_chain = email_prompt_template | qwen_llm | StrOutputParser()

# 输入参数
recipient_name_input = "项目团队全体成员"
meeting_topic_input = "关于第三季度项目进展的讨论会"
meeting_date_input = "下周三（具体日期待定，请留空或提示）" # 示例：让AI处理不确定性
meeting_time_input = "下午2:00 - 3:30"
meeting_location_input = "公司301会议室 / 远程参与链接待定"
email_purpose_input = "邀请参加会议，并简要说明会议目的。"
sender_name_input = "项目经理 李明"

print(f"\n--- 案例3：生成邮件草稿 ---")
print(f"邮件信息:\n"
      f"  收件人: {recipient_name_input}\n"
      f"  主题: {meeting_topic_input}\n"
      f"  日期: {meeting_date_input}\n"
      f"  时间: {meeting_time_input}\n"
      f"  地点: {meeting_location_input}\n"
      f"  目的: {email_purpose_input}\n"
      f"  发件人: {sender_name_input}")
try:
    email_draft = email_generation_chain.invoke({
        "recipient_name": recipient_name_input,
        "meeting_topic": meeting_topic_input,
        "meeting_date": meeting_date_input,
        "meeting_time": meeting_time_input,
        "meeting_location": meeting_location_input,
        "email_purpose": email_purpose_input,
        "sender_name": sender_name_input
    })
    print("\n生成的邮件草稿：")
    print(email_draft)
except Exception as e:
    print(f"生成邮件时出错: {e}")
            </code></pre>
            <p>这个例子展示了如何通过结构化的输入信息，让LLM生成格式规范的邮件内容。你可以根据需要调整提示，以生成不同类型和风格的邮件。</p>
            
            <h3>总结</h3>
            <p>通过精心设计的提示模板和Langchain的链式调用，结合Qwen等强大LLM的生成能力，我们可以有效地实现各种自动化文本生成任务。关键在于：</p>
            <ul>
                <li><strong>明确的指令：</strong> 在提示中清晰地告诉LLM你希望它扮演的角色、任务目标、输出格式和风格。</li>
                <li><strong>结构化输入：</strong> 为LLM提供必要的上下文信息和关键参数。</li>
                <li><strong>迭代优化：</strong> 不断测试和调整提示，以获得满意的生成结果。</li>
            </ul>
            <p>这些只是简单的示例，你可以进一步扩展这些思路，例如结合RAG来生成基于特定文档的报告，或者使用更复杂的链来分步骤完成长文本的创作。</p>
        </section>
        
        <div class="navigation">
            <a href="../langchain_tutorial_outline.html">返回教程目录</a>
            <a href="../chapter9/chapter9_application_qa.html">上一节：9.1 构建一个简单的问答系统</a>
            <!-- <a href="../chapter9/chapter9_application_extraction.html">下一节：9.3 从文本中提取结构化信息</a> -->
        </div>
    </div>
</body>
</html>
